#ifndef __WIZ_DATATYPE_COLOR_UINT32_HPP__SHANHAOBO_19800429__
#define __WIZ_DATATYPE_COLOR_UINT32_HPP__SHANHAOBO_19800429__

#include "../../Base/Type/WizBaseType.hpp"

namespace Wiz
{
    namespace RGBA
    {
        struct WIZ_EXPORT Type
        {
            union
            {
                struct
                {
#           if (WIZ_CFG_ENDIAN_NATIVE == WIZ_CFG_ENDIAN_BIG)
                    ::Wiz::UInt8::Type  r, g, b, a;
#           else
                    ::Wiz::UInt8::Type  a, b, g, r;
#           endif /**/
                };
                ::Wiz::UInt32::Type     m_Value;
            };

            Type();
            Type(::Wiz::UInt8::In R, ::Wiz::UInt8::In G, ::Wiz::UInt8::In B, ::Wiz::UInt8::In A);
            Type(::Wiz::UInt32::In V);

            ////////////////////////////////////////////////////////////////
            template<class OutT>
            WIZ_INLINE ::Wiz::Size::Type CopyTo(OutT* DestPtr) const
            {
                return ::Wiz::Memory::CopySrcStd(DestPtr, &(this->m_Value), 1);
            }
            template<class InT>
            WIZ_INLINE ::Wiz::Size::Type CopyFrom(const InT* SrcPtr)
            {
                return ::Wiz::Memory::CopyDestStd(&(this->m_Value), SrcPtr, 1);
            }
            ////////////////////////////////////////////////////////////////
        };

    } /// end of namespace RGBA

    namespace ARGB
    {
        struct WIZ_EXPORT Type
        {
            union
            {
                struct
                {
#           if (WIZ_CFG_ENDIAN_NATIVE == WIZ_CFG_ENDIAN_BIG)
                    ::Wiz::UInt8::Type  a, r, g, b;
#           else
                    ::Wiz::UInt8::Type  b, g, r, a;
#           endif /**/
                };
                ::Wiz::UInt32::Type     m_Value;
            };

            Type();
            Type(::Wiz::UInt8::In R, ::Wiz::UInt8::In G, ::Wiz::UInt8::In B, ::Wiz::UInt8::In A);
            Type(::Wiz::UInt32::In V);

            ////////////////////////////////////////////////////////////////
            template<class OutT>
            WIZ_INLINE ::Wiz::Size::Type CopyTo(OutT* DestPtr) const
            {
                return ::Wiz::Memory::CopySrcStd(DestPtr, &(this->m_Value), 1);
            }
            template<class InT>
            WIZ_INLINE ::Wiz::Size::Type CopyFrom(const InT* SrcPtr)
            {
                return ::Wiz::Memory::CopyDestStd(&(this->m_Value), SrcPtr, 1);
            }
            ////////////////////////////////////////////////////////////////
        };
    } /// end of namespace ARGB

    namespace ABGR
    {
        struct WIZ_EXPORT Type
        {
            union
            {
                struct
                {
#           if (WIZ_CFG_ENDIAN_NATIVE == WIZ_CFG_ENDIAN_BIG)
                    ::Wiz::UInt8::Type  a, b, g, r;
#           else
                    ::Wiz::UInt8::Type  r, g, b, a;
#           endif /**/
                };
                ::Wiz::UInt32::Type     m_Value;
            };

            Type();
            Type(::Wiz::UInt8::In R, ::Wiz::UInt8::In G, ::Wiz::UInt8::In B, ::Wiz::UInt8::In A);
            Type(::Wiz::UInt32::In V);

            ////////////////////////////////////////////////////////////////
            template<class OutT>
            WIZ_INLINE ::Wiz::Size::Type CopyTo(OutT* DestPtr) const
            {
                return ::Wiz::Memory::CopySrcStd(DestPtr, &(this->m_Value), 1);
            }
            template<class InT>
            WIZ_INLINE ::Wiz::Size::Type CopyFrom(const InT* SrcPtr)
            {
                return ::Wiz::Memory::CopyDestStd(&(this->m_Value), SrcPtr, 1);
            }
            ////////////////////////////////////////////////////////////////
        };
    } /// end of namespace ABGR

    namespace BGRA
    {
        struct WIZ_EXPORT Type
        {
            union
            {
                struct
                {
#           if (WIZ_CFG_ENDIAN_NATIVE == WIZ_CFG_ENDIAN_BIG)
                    ::Wiz::UInt8::Type  b, g, r, a;
#           else
                    ::Wiz::UInt8::Type  a, r, g, b;
#           endif /**/
                };
                ::Wiz::UInt32::Type     m_Value;
            };

            Type();
            Type(::Wiz::UInt8::In R, ::Wiz::UInt8::In G, ::Wiz::UInt8::In B, ::Wiz::UInt8::In A);
            Type(::Wiz::UInt32::In V);

            ////////////////////////////////////////////////////////////////
            template<class OutT>
            WIZ_INLINE ::Wiz::Size::Type CopyTo(OutT* DestPtr) const
            {
                return ::Wiz::Memory::CopySrcStd(DestPtr, &(this->m_Value), 1);
            }
            template<class InT>
            WIZ_INLINE ::Wiz::Size::Type CopyFrom(const InT* SrcPtr)
            {
                return ::Wiz::Memory::CopyDestStd(&(this->m_Value), SrcPtr, 1);
            }
            ////////////////////////////////////////////////////////////////
        };
    } /// end of namespace BGRA

    //////////////////////////////////////////////////////////////////////////
} /// end of namespace Wiz

#endif /*__WIZ_DATATYPE_COLOR_UINT32_HPP__SHANHAOBO_19800429__*/
